Во-первых, проверить бит ACK. Если бит ACK выставлен, то в случае, если SEG.ACK = <ISS или SEG.ACK > SND.NXT, послать сигнал перезагрузки <SEQ=SEG.ACK><CTL=RST> (Если не выставлен бит RST. Если он все же выставлен, то, ничего не делая выкинуть пришедший сегмент и вернуть управление прерванной программе.) Ликвидировать сегмент, вернуть управление.
Если SND.UNA =< SEG.ACK =< SND.NXT, то полученное в сегменте подтверждение становится приемлемым.
Во-вторых, проверить бит RST.
В случае, если бит RST выставлен. Если ожидалось получение сегмента с подтверждением, то дать клиенту объявление "error: connection reset", вернуть сегмент, перейти в состояние CLOSED, убрать блок TCB, и, наконец, вернуть управление прерванной программе. В противном случае (нет подтверждения) ликвидировать сегмент и вернуть управление.
В-третьих, проверить уровни безопасности и приоритета. Если в пришедшем сегменте значения полей безопасность/ закрытость не совпадают в точности со значениями в блоке TCB, то послать сигнал перезагрузки, а точнее если имеется ACK, то послать <SEQ=SEG.ACK><CTL=RST> в противном случае послать <SEQ=0><ACK=SEG.SEQ+SEG.LEN><CTL=RST,ACK> Если имеется значение ACK, то приоритет в пришедшем сегменте должен совпадать с приоритетом, указанным в блоке TCB. Если это не так, то послать сигнал перезагрузки <SEQ=SEG.ACK><CTL=RST>.
Если же ACK отсутствует, то выполнить следующее. Если в сегменте указан приоритет выше, чем приоритет в блоке TCB, то, если это позволяют клиент и система, увеличить значение приоритета в блоке TCB до значения, указанного в сегменте. Если же увеличивать приоритет не разрешается, послать сигнал перезагрузки: <SEQ=0><ACK=SEG.SEQ+SEG.LEN><CTL=RST,ACK> Если в сегменте указан приоритет, меньший, чем в блоке TCB, то просто перейти к следующему пункту анализа.
В-четвертых, проверить установку бита SYN. Данный этап должен осуществляться только если бит ACK не вызывает проблем, или если он не установлен, сегмент также не содержит сигнала RST.
Если бит SYN установлен и параметры безопасности/ закрытости приоритета являются приемлемыми, то в переменную SEG.NXT записать значение SEG. SEQ+1, а IRS установить равным SEG.SEQ. SND.UNA должно быть повышено до SEG.ACK (если имеется ACK), а любые сегменты в очереди на повторную посылку, получившие таким образом подтверждение, должны быть удалены.
Если SND.UNA > ISS (наш сигнал SYN получит подтверждение), то установить для соединения состояние ECTABLISHED и сформировать ACK сегмент <SEQ-SND.NXT><ACK=RCV.NXT><CTL=ACK> и отправить его. В этот сегмент могут быть включены данные или команды из очереди на отправление. Если в пришедшем сегменте есть иные команды или даже некий текст в поле данных, то продолжить обработку далее, начиная с шестого этапа ниже, где осуществляется проверка бита URG. Если таких команд и данных нет, передать управление прерванной программе.
Если же бит SYN не установлен, то перейти в состояние SYN-RECEIVED, сформировать сегмент SYN, ACK: <SEQ=ISS><ACK=RCV.NXT><CTL=SYN,ACK> и послать его. Если в пришедшем сегменте имеются команды или текст в поле данных, то поместить их в очередь для обработки после установления ESTABLISH состояния. Вернуть управление прерванной программе.
В-пятых, если установлены биты SYN или RST, то выкинуть пришедший сегмент и вернуть управление прерванной программе.
Если во время прихода сегмента соединение находилось в состоянии, не описанном выше, то Во-первых, проверить номер очереди.
Состояния
SYN-RECEIVED ESTABLISHED FIN-WAIT-1 FIN-WAIT-2 CLOSE-WAIT CLOSING LAST-ACK TIME-WAIT
Сегменты обрабатываются по очереди. По получении сегмента сперва осуществляется тест для удаления старых дубликатов, но дальнейшая обработка осуществляется в порядке номеров SEG.SEQ. Если содержимое сегмента перекрывает границу между старой и пока новой информацией, то должны обрабатываться только новые данные.
Тест на приемлемость приходящего сегмента рассматривает четыре варианта:
Длина Окно Текст сегмента получения 0 0 SEG.SEQ = RCV.NXT 0 >0 RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND >0 0 сегмент неприемлем >0 >0 RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND или RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND
Если RCV.WND нулевой, никакие сегменты не будут приемлемы, однако должна быть специально оговорена приемлемость получения правильных сигналов ACK, URG и RST.
Если приходящий сегмент неприемлем, то в ответ послать его подтверждение <SEQ=SND.NXT><ACK=RCV.NXT><CTL=ACK> если бит RST не установлен (если он все же выставлен, то выкинуть пришедший сегмент и вернуть управление прерванной программе.)
После посылки подтверждения ликвидировать непринятий сегмент и вернуть управление прерванной программе.
В дальнейшем рекомендации строятся на предположении, что пришедший сегмент является идеализированным и начинается с RSV.NXT, не выходящим за окно. Реальные же сегменты можно подгонять под такое предположение, отбрасывая любые их части, выходящие за пределы окна (включая даже сигналы SYN и FIN), и осуществляя дальнейшую их обработку только если сегмент после этого начинается с номера RCV.NXT. Сегменты с большими номерами в очереди сохраняются для обработки в дальнейшем.
Во-вторых, проверить бит RST.